package CONTABILIDAD_MODELO;
import Conexion.Conexion;
import Modelo.SIS_VERSION;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class CON_CENTRO_COSTO{
    private double ID_CUENTA_CONTABLE;
    private double ID;
    private String CODIGO;
    private String DESCRIPCION;
    private double ID_NIVEL_CENTRO_COSTO;
    private Conexion con = null;

    public CON_CENTRO_COSTO(Conexion con){
         this.con=con;
     }

    public CON_CENTRO_COSTO(double ID_NIVEL_CENTRO_COSTO,String DESCRIPCION,String CODIGO,double ID,double ID_CUENTA_CONTABLE){
            this.ID_NIVEL_CENTRO_COSTO =ID_NIVEL_CENTRO_COSTO;
            this.DESCRIPCION =DESCRIPCION;
            this.CODIGO =CODIGO;
            this.ID =ID;
            this.ID_CUENTA_CONTABLE =ID_CUENTA_CONTABLE;
    }

    public boolean Insertar(){
        try{

            String consulta = "insert into BROKER.CON_CENTRO_COSTO(ID_NIVEL_CENTRO_COSTO,DESCRIPCION,CODIGO,ID,ID_CUENTA_CONTABLE) VALUES (";
            if(ID_NIVEL_CENTRO_COSTO==0)
                consulta+="null,'"+DESCRIPCION+"','"+CODIGO+"',"+ID+","+ID_CUENTA_CONTABLE+")";
            else
                consulta+=ID_NIVEL_CENTRO_COSTO+",'"+DESCRIPCION+"','"+CODIGO+"',"+ID+","+ID_CUENTA_CONTABLE+")";

            con.EjecutarSentencia(consulta);
            CON_CENTRO_COSTO ccp = new CON_CENTRO_COSTO(con);
            ccp=ccp.BuscarXCodigo(CODIGO);
            SIS_VERSION version=new SIS_VERSION(con);
            version.Insertar(0,"centro","SE Creo el centro costo "+DESCRIPCION, 0.0, ccp.getID(),"I");
            return true;
        }
        catch(Exception e){
                 e.printStackTrace();
                 return false;
        }
    }

    public boolean actualizar(){
            try{

                    String consulta = "update BROKER.CON_CENTRO_COSTO "
                            + "set DESCRIPCION='"+DESCRIPCION+"' where ID="+ID;                         
                    con.EjecutarSentencia(consulta);
                        SIS_VERSION version=new SIS_VERSION(con);
                        version.Insertar(0,"centro","se actualizo el centro costo "+DESCRIPCION, 0.0, ID,"M");
                    return true;
            }
            catch(Exception e){
                    e.printStackTrace();
                    return false;
            }
    }

    public boolean EliminarXid(){
        try{
            CON_CENTRO_SUC_REG_DEP crd = new CON_CENTRO_SUC_REG_DEP();
            crd.setCon(con);

            crd.EliminarTodoElCCd(getID());

            String consulta = "delete from BROKER.CON_CENTRO_COSTO where ID = "+getID();
            con.EjecutarSentencia(consulta);
            SIS_VERSION version=new SIS_VERSION(con);
            version.Insertar(0,"centro","Elimino el centro costo "+DESCRIPCION, 0.0, getID(),"E");
           return true;
           }
          catch(Exception e){
                   e.printStackTrace();
                   return false;
          }
    }
    public String generarListaHojasdescripcion(String cod)
    {
        try
        {
            String hojasjson="{";
            String consulta = "SELECT  DESCRIPCION,ID_CUENTA_CONTABLE,ID_NIVEL_CENTRO_COSTO,ID, CODIGO FROM BROKER.CON_CENTRO_COSTO ";
            ResultSet rs = con.EjecutarConsulta(consulta);

            while(rs.next())
            {
                CON_CENTRO_SUC_REG_DEP ccrd = new CON_CENTRO_SUC_REG_DEP();
                ccrd.setCon(con);
                double id=Double.parseDouble(rs.getString("ID"));
                List<CON_CENTRO_SUC_REG_DEP> listaccr = ccrd.BuscarXid(id);
                String tipo="";
                if(listaccr.size()==0)
                    tipo="ccnormal";
                else
                {
                    if(listaccr.get(0).getID_DEPTO()!=0){
                       tipo="ccdepto";
                    }
                    if(listaccr.get(0).getID_REGIONAL()!=0 && listaccr.get(0).getPORCENTAJE_REGIONAL()==-1){
                        tipo="ccregional";
                    }
                    if(listaccr.get(0).getPORCENTAJE_REGIONAL()> 0){
                        tipo="ccrnacional";
                    }
                    if(listaccr.get(0).getPORCENTAJE_SUCURSAL() ==-1){
                        tipo="ccsucursal";
                    }
                    if(listaccr.get(0).getPORCENTAJE_SUCURSAL() > 0){
                        tipo="ccTsucursal";
                    }
                }
                hojasjson+="\"cc"+rs.getString(cod)+"\":{\"CODIGO\":\""+rs.getString("CODIGO")+"\", \"DESCRIPCION\":\""+rs.getString("DESCRIPCION")+"\", \"NIVEL\":\""+rs.getString("ID_NIVEL_CENTRO_COSTO")+"\", \"tipo\":\""+tipo+"\", \"id\":\""+(int)id+"\", \"IDCUENTA\":\""+rs.getDouble("ID_CUENTA_CONTABLE")+"\"},";
            }
            if(hojasjson.length()==1){
                return "[]";
            }
            return hojasjson.substring(0,hojasjson.length()-1)+"}";
        }
        catch(Exception e)
        {
            return "";
        }
    }
    String listac="<ul>";
    public String generarListaCentroCosto(double idnivel, double idcuenta)
    {
        try
        {
            String consulta = "";
            if(idnivel==0)
            {
                consulta = "select * from BROKER.CON_CENTRO_COSTO where ID_NIVEL_CENTRO_COSTO is null and ID_CUENTA_CONTABLE = "+idcuenta;
            }
            else
            {
                consulta = "select * from BROKER.CON_CENTRO_COSTO where ID_NIVEL_CENTRO_COSTO ="+idnivel+" and ID_CUENTA_CONTABLE="+idcuenta;
                listac+="<ul>";
            }
            ResultSet rs = con.EjecutarConsulta(consulta);
            List<CON_CENTRO_COSTO> centroc =Cargar(rs);
            if(centroc.size()!=0)
            {
                for(int i =0; i<centroc.size();i++)
                {

                    CON_CENTRO_SUC_REG_DEP crd = new CON_CENTRO_SUC_REG_DEP();
                    crd.setCon(con);

                    if(crd.BuscarCCxRegional(centroc.get(i).getID()).size()>0)
                        listac+="<li>"+centroc.get(i).getDESCRIPCION()+"<span><a href='CON_ELIMINAR_CENTRO_COSTO.jsp?id="+centroc.get(i).getID()+"'>(-)</a></span></li>";
                    else
                        listac+="<li>"+centroc.get(i).getDESCRIPCION()+"<span><a href='CON_CENTROS_COSTO.jsp?idcuenta="+centroc.get(i).getID_CUENTA_CONTABLE()+"&idcentroc="+centroc.get(i).getID()+"'>(+)</a><a href='CON_ELIMINAR_CENTRO_COSTO.jsp?id="+centroc.get(i).getID()+"'>(-)</a></span></li>";
                    generarListaCentroCosto(centroc.get(i).getID(), centroc.get(i).getID_CUENTA_CONTABLE());

                }                    
                listac+="</ul>";
            }
            else
            {
                listac+="</ul>";
            }
        }
        catch(Exception e)
        {

        }
        return listac;
    }

    public CON_CENTRO_COSTO BuscarXid(double id) throws SQLException{        
        String consulta = "select * from BROKER.CON_CENTRO_COSTO where ID = "+id;
        ResultSet rs = con.EjecutarConsulta(consulta);
        List<CON_CENTRO_COSTO> lista= Cargar(rs);
        if(lista.size()>0)
            return lista.get(0);
        else
            return null;        
    }

    public List<CON_CENTRO_COSTO> BuscarCentrosCostohijo(double idCuenta, double centrocosto) throws SQLException
    {        
        String consulta ="";
        if(centrocosto ==0)
            consulta = "select * from BROKER.CON_CENTRO_COSTO where ID_CUENTA_CONTABLE = "+idCuenta+" and ID_NIVEL_CENTRO_COSTO is null";
        else
            consulta = "select * from BROKER.CON_CENTRO_COSTO where ID_NIVEL_CENTRO_COSTO = "+centrocosto;

        ResultSet rs = con.EjecutarConsulta(consulta);
        return Cargar(rs);        
    }

    String jsoncentros="";
    private String sacarhojas(double idcuenta, double idcosto) throws SQLException
    {
        List<CON_CENTRO_COSTO> lista = BuscarCentrosCostohijo(idcuenta, idcosto);                                

        jsoncentros+="<ul class=\"tab\">";

        for(int i =0; i<lista.size(); i++)
        {   
            if(BuscarCentrosCostohijo(idcuenta, lista.get(i).getID()).size()>0)
                jsoncentros+="<li value='"+lista.get(i).getCODIGO()+"'>"+lista.get(i).getDESCRIPCION()+"</li>";
            else
                jsoncentros+="<li value='"+lista.get(i).getCODIGO()+"'>"+lista.get(i).getDESCRIPCION()+"<a href='#' onclick=\"seleccionarCentroConstoHoja('"+lista.get(i).getCODIGO()+"', '"+lista.get(i).getDESCRIPCION()+"')\">(+)</a></li>";
            sacarhojas(idcuenta, lista.get(i).getID());                
        }
        jsoncentros+="</ul>";

        return jsoncentros;
    }

    List<CON_CENTRO_COSTO> listacentro = new ArrayList<>();        
    private List<CON_CENTRO_COSTO> sacarhojasList(double idcuenta, double idcosto) throws SQLException
    {
        List<CON_CENTRO_COSTO> lista = BuscarCentrosCostohijo(idcuenta, idcosto);            

        for(int i =0; i<lista.size(); i++)
        {   
            if(BuscarCentrosCostohijo(idcuenta, lista.get(i).getID()).size()<=0)
                listacentro.add(lista.get(i));

            sacarhojasList(idcuenta, lista.get(i).getID());                
        }

        return listacentro;
    }

    private String sacarhojasCombo(double idcuenta, double idcosto) throws SQLException
    {
        List<CON_CENTRO_COSTO> lista = BuscarCentrosCostohijo(idcuenta, idcosto);            

        for(int i =0; i<lista.size(); i++)
        {   
            if(BuscarCentrosCostohijo(idcuenta, lista.get(i).getID()).size()<=0)
                jsoncentros+="<option value='"+(int)lista.get(i).getID()+"'>"+lista.get(i).getDESCRIPCION()+"</option>";

            sacarhojasCombo(idcuenta, lista.get(i).getID());                
        }

        return jsoncentros;
    }

    public boolean tierneCentrocosto(String codigo) throws SQLException
    {
        CON_CUENTA_CONTABLE cuenta = new CON_CUENTA_CONTABLE(con);
        cuenta.setCon(con);
        if(codigo.equals(""))
            return false;
        cuenta=cuenta.BuscarXCodigo(codigo);
        if(cuenta!=null)
        {
            List<CON_CENTRO_COSTO> lista = BuscarCentrosCostohijo(cuenta.getID(), 0);                                

                if(lista.size()>0)
                    return true;
                else
                    return false;            
        }
        else
            return false;
    }

     public CON_CENTRO_COSTO BuscarXCodigo(String codigo)
    {
            try{String consulta = "select * from BROKER.CON_CENTRO_COSTO where CODIGO like('"+codigo+"') ";
                    ResultSet rs = con.EjecutarConsulta(consulta);
                    return Cargar(rs).get(0);}
            catch(Exception e){
                    e.printStackTrace();}
                    return null;
    }

    public CON_CENTRO_COSTO Buscar(double idcuenta, String codigo, String descripcion){
            try{String consulta = "select * from BROKER.CON_CENTRO_COSTO where ID_CUENTA_CONTABLE = "+idcuenta+" and DESCRIPCION like('"+descripcion+"') and CODIGO like('"+codigo+"')";
                    ResultSet rs = con.EjecutarConsulta(consulta);
                    return Cargar(rs).get(0);}
            catch(Exception e){
                    e.printStackTrace();}
                    return null;
    }



    public List<CON_CENTRO_COSTO> TodosXcuenta(double idcuenta, double idcentroc){
            try{

                String consulta = "";
                if(idcentroc==0)
                    consulta = "select * from BROKER.CON_CENTRO_COSTO where ID_CUENTA_CONTABLE = "+idcuenta+" and ID_NIVEL_CENTRO_COSTO is null";
                else
                    consulta = "select * from BROKER.CON_CENTRO_COSTO where ID_CUENTA_CONTABLE = "+idcuenta+" and ID_NIVEL_CENTRO_COSTO ="+idcentroc;

                ResultSet rs = con.EjecutarConsulta(consulta);
                return Cargar(rs);
            }
            catch(Exception e){
                    e.printStackTrace();}
                    return null;
    }

    public List<CON_CENTRO_COSTO> Todos(){
            try{
                String consulta = "select * from BROKER.CON_CENTRO_COSTO";
                    ResultSet rs = con.EjecutarConsulta(consulta);
                    return Cargar(rs);}
            catch(Exception e){
                    e.printStackTrace();}
                    return null;
    }

    public List<CON_CENTRO_COSTO> Cargar(ResultSet rs){
            try{
                    List<CON_CENTRO_COSTO> lista = new ArrayList<CON_CENTRO_COSTO>();
                    while(rs.next()){
                            CON_CENTRO_COSTO objeto = new CON_CENTRO_COSTO(con);

                            objeto.setID_CUENTA_CONTABLE(rs.getDouble("ID_CUENTA_CONTABLE"));
                            objeto.setID(rs.getDouble("ID"));
                            objeto.setCODIGO(rs.getString("CODIGO"));
                            objeto.setDESCRIPCION(rs.getString("DESCRIPCION"));
                            objeto.setID_NIVEL_CENTRO_COSTO(rs.getDouble("ID_NIVEL_CENTRO_COSTO"));
                             objeto.setCon(con);
                            lista.add(objeto);
                    }
                    return lista;
            }
            catch(SQLException ex){
                    ex.printStackTrace();
            return null;}
    }

    public double getID_CUENTA_CONTABLE(){
            return ID_CUENTA_CONTABLE;
    }
    public void setID_CUENTA_CONTABLE(double ID_CUENTA_CONTABLE){
            this.ID_CUENTA_CONTABLE=ID_CUENTA_CONTABLE;
    }

    public double getID(){
            return ID;
    }
    public void setID(double ID){
            this.ID=ID;
    }

    public String getCODIGO(){
            return CODIGO;
    }
    public void setCODIGO(String CODIGO){
            this.CODIGO=CODIGO;
    }

    public String getDESCRIPCION(){
            return DESCRIPCION;
    }
    public void setDESCRIPCION(String DESCRIPCION){
            this.DESCRIPCION=DESCRIPCION;
    }

    public double getID_NIVEL_CENTRO_COSTO(){
            return ID_NIVEL_CENTRO_COSTO;
    }
    public void setID_NIVEL_CENTRO_COSTO(double ID_NIVEL_CENTRO_COSTO){
            this.ID_NIVEL_CENTRO_COSTO=ID_NIVEL_CENTRO_COSTO;
    }

    public Conexion getCon() {
            return con;
    }
    public void setCon(Conexion con) {
            this.con = con;
    }

    public String getPUCcCuenta(double idcuenta)
    {
        generarListaCentroCosto(0, idcuenta);
        return listac;
    } 

    public String gethojas(String codigo) throws SQLException
    {
        CON_CUENTA_CONTABLE cuenta = new CON_CUENTA_CONTABLE(con);
        cuenta.setCon(con);
        double idcuenta = cuenta.BuscarXCodigo(codigo).getID();
        jsoncentros="";
        return sacarhojas(idcuenta, 0);
    }
    public String gethojasCombo(String codigo) throws SQLException
    {
        CON_CUENTA_CONTABLE cuenta = new CON_CUENTA_CONTABLE(con);
        cuenta.setCon(con);
        double idcuenta = cuenta.BuscarXCodigo(codigo).getID();
        return sacarhojasCombo(idcuenta, 0);
    }
    public List<CON_CENTRO_COSTO> gethojasList(String codigo) throws SQLException
    {
        CON_CUENTA_CONTABLE cuenta = new CON_CUENTA_CONTABLE(con);
        cuenta.setCon(con);
        double idcuenta = cuenta.BuscarXCodigo(codigo).getID();
        return sacarhojasList(idcuenta, 0);
    }            
}
